﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Text.RegularExpressions;


namespace AQMProject
{
    class WriteRSSinDB
    {
        //Zähler, wieviele Nachrichten in einer gestarteten Abfrage eingelesen wurden.
        int feedanz = 0;

        public void RSSUpdate()
        {

            //Aktien Manager instanziieren und die Daten in die Liste schreiben
            AktieManager service2 = new AktieManager();
            List<aktienrssflinks> rsslinks2;
            rsslinks2 = service2.GetAktienRSSFLinks();

            //RSSManager instanziieren
            RssManager service = new RssManager();

            // Lokale Liste fürs einlesen von RSS-Feeds
            List<RssItem> resultFinanznachricht;

            // Empfehlungsmanager instanziieren und einen Pool an Empfehlungsbegriffen generieren
            EmpfehlungManager service3 = new EmpfehlungManager();
            List<empferkennung> empfehlungsbegriff;
            empfehlungsbegriff = service3.getAlleKennungen();

            //Bankmanager instanziieren und einen Pool an Bankennamen generieren
            BankManager service4 = new BankManager();
            List<bankerkennung> bank;
            bank = service4.getBankMatching();

            //Trennzeichen
            char[] delimiterChars = {'\''};

            // Messagearray für ausgelesenen Nachrichtentitel
            string messagetext = "";
            string[] messagewoerterarray;

            //Datum des letzten Einlesevorgangs auslesen
            DateTime letztesDatumUhrzeit = service.getLastDateTime();
            int empfehlung = 0;
            int bankID = 0;

            //Instanziierung der Einlesedaten (=Datum+Uhrzeit)
            Einlesedaten aktuell = new Einlesedaten();

            //Boolsche Variabe wenn ein Wort aus den Empfehlungsbezeichnungen in der RSSMeldung gefunden wird
            Boolean match = false;

            //für jedes Objekt aus aktienrssflinks welches einen rsslink (=http adresse) enthält...
            foreach (aktienrssflinks rssaddr in rsslinks2)
            {
                //RSS Link setzen
                resultFinanznachricht = service.GetItems(rssaddr.link);

                //für jedes RSSObjekt...
                foreach (RssItem item in resultFinanznachricht)
                {
                    if (item.DatumUhrzeit > letztesDatumUhrzeit)
                    {
                        //parse Titel
                        messagetext = item.Title;
                        messagewoerterarray = messagetext.Split(delimiterChars);

                        //für jedes gelesene Wort...
                        foreach (string s in messagewoerterarray)
                        {
                            //für jeden Empfehlungsbegriff...
                            foreach (empferkennung e in empfehlungsbegriff)
                            {
                                //prüfen ob das gelesene Wort aus der Nachricht einem Empfehlungsbegriff entspricht.
                                if (s == e.kennung)
                                {
                                    match = true;
                                    empfehlung = e.empfehlung_idempfehlung;

                                    break;
                                }
                                else
                                {
                                    //Alternativ, wenn in dem vorher abgefragten Arrays der Empfehlungsbegriff nicht gefunden wurde,
                                    //soll geprüft werden, ob der übergebene Empfehlungsbegriff e.kennung irgendwo vorkommt.
                                    if (System.Text.RegularExpressions.Regex.IsMatch(item.Title, e.kennung, System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace))
                                    {
                                        match = true;
                                        empfehlung = e.empfehlung_idempfehlung;

                                        break;
                                    }
                                }
                            }
                        }
                        //für jede existierende Bankbezeichnung...
                        foreach (bankerkennung b in bank)
                        {
                            //prüfen, ob der Bankname im übergebenen Titel vorkommt.
                            if (System.Text.RegularExpressions.Regex.IsMatch(item.Title, b.erkennung, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
                            {
                                bankID = b.bank_idbank;
                                break;
                            }
                        }
                    }
                    
                        // Wenn in dem Titel ein Empfehlungsbegriff gefunden wurde...
                        if (match == true)
                        {
                            // Rssübersichtobjekt erstellen
                            rssuebersicht rssinsert = new rssuebersicht();

                            //Rssübersicht Objekt mit Datenfüllen
                            rssinsert.DatumUhrzeit = item.DatumUhrzeit;
                            rssinsert.nachricht = item.Title;
                            rssinsert.empfehlung_idempfehlung = empfehlung;
                            rssinsert.aktie_aktienkuerzel = rssaddr.aktie_aktienkuerzel;
                            rssinsert.bank_idbank = bankID;
                            rssinsert.link = item.Link;
                            rssinsert.eingelesen_am = DateTime.Now;

                            //Geparstes Objekt "Rssübersicht" in die Datenbank schreiben
                            service.Insert(rssinsert);

                            // erhöhe importierte Feedanzahl um 1
                            feedanz++;                           
                        }
                        empfehlung = 0;
                        bankID = 0;
                        match = false;
                }
            }

            //Setzen und schreiben in die Datenbank des aktuellen Einlesezeitpunktes
            aktuell.einlesedatum = DateTime.Now;
            service.setLastDateTime(aktuell);

        }


        //Anzahl der eingelesenen Feeds abrufen
        public int getFeedAnz()
        {
            return feedanz;
        }
    }
}
